package dao;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;

import sistemaAlmacen.Articulo;
import sistemaAlmacen.Pedido;


public class DAOAlmacen extends DAO{

	public DAOAlmacen(){
		super();
	}
	
	public ArrayList<Articulo> consultarInventario(){
		
		ArrayList<Articulo> listaArticulos = new ArrayList<Articulo>();
		
		int id, cantidad;
		
		String nombre,tipo;
		
		ResultSet rs = null;
		try{
			PreparedStatement ps = conexion.prepareStatement(
					"SELECT `ARTICULOS`.`ID_ARTICULO`, "
					+ "`ARTICULOS`.`NOMBRE`, "
					+ "`ARTICULOS`.`TIPO`,"
					+ "`ARTICULOS`.`CANTIDAD` "
					+ "FROM `fixpack`.`ARTICULOS`; ");

			rs =ps.executeQuery();
			
			while (rs.next()){
				
				id= rs.getInt(1);
				nombre = rs.getString(2);
				tipo=rs.getString(3);
				cantidad =rs.getInt(4);		
				
				Articulo articulo = new Articulo(id,nombre,tipo,cantidad);
				
				listaArticulos.add(articulo);
				
			}
			
			ps.close();
		}
		catch (Exception e){
			e.printStackTrace()	;
		}
		
		return listaArticulos;
	}

	public ArrayList<Articulo> consultarInventario(String paramNombre, String paramTipo,
			int paramCantidad) {
		
		ArrayList<Articulo> listaArticulos = new ArrayList<Articulo>();
		
		int id, cantidad;
		
		String nombre,tipo;
		
		ResultSet rs = null;
		try{
			PreparedStatement ps = conexion.prepareStatement(
					"SELECT `ARTICULOS`.`ID_ARTICULO`, "
					+ "`ARTICULOS`.`NOMBRE`, "
					+ "`ARTICULOS`.`TIPO`,"
					+ "`ARTICULOS`.`CANTIDAD` "
					+ "FROM `fixpack`.`ARTICULOS`"
					+ "WHERE NOMBRE LIKE CONCAT('%' , REPLACE(?,' ','%') , '%') "
					+ "AND	 TIPO LIKE CONCAT('%' , REPLACE(?,' ','%') , '%') "
					+ "AND 	 CANTIDAD >= ?; ");

			ps.setString(1, paramNombre);
			ps.setString(2, paramTipo);
			ps.setInt(3, paramCantidad);
			
			rs =ps.executeQuery();
			
			while (rs.next()){
				
				id= rs.getInt(1);
				nombre = rs.getString(2);
				tipo=rs.getString(3);
				cantidad =rs.getInt(4);		
				
				
				Articulo articulo = new Articulo(id,nombre,tipo,cantidad);
				
				listaArticulos.add(articulo);
				
			}
			
			ps.close();
		}
		catch (Exception e){
			e.printStackTrace()	;
		}
		
		return listaArticulos;
	}

	public Articulo obtenerArticulo(String nombre){
		
		Articulo articulo = null;
		int id, cantidad;
		String tipo;
		
		ResultSet rs = null;
		try{
			PreparedStatement ps = conexion.prepareStatement(
					"SELECT `ARTICULOS`.`ID_ARTICULO`, "
					+ "`ARTICULOS`.`NOMBRE`, "
					+ "`ARTICULOS`.`TIPO`,"
					+ "`ARTICULOS`.`CANTIDAD` "
					+ "FROM `fixpack`.`ARTICULOS`"
					+ "WHERE NOMBRE = ? ");

			ps.setString(1, nombre);
			rs =ps.executeQuery();
			
			if (rs.next()){
				
				id= rs.getInt(1);
				nombre = rs.getString(2);
				tipo=rs.getString(3);
				cantidad =rs.getInt(4);		
				
				
				articulo = new Articulo(id,nombre,tipo,cantidad);
			}
			ps.close();
		}
		catch (Exception e){
			e.printStackTrace()	;
		}
		
		return articulo;
		
	}
	
	
	public ArrayList<Pedido> consultarPedidos(){
		
		ArrayList<Pedido> listaPedidos = new ArrayList<Pedido>();
		
		int id;
		Date fecha;
		
		String nombreProveedor,emailProveedor,estado;
		
		ResultSet rs = null;
		try{
			PreparedStatement ps = conexion.prepareStatement(
					"SELECT `PEDIDOS`.`ID_PEDIDO`,"
					+ "`PEDIDOS`.`FECHA`,"
					+ " `PEDIDOS`.`ESTADO`,"
					+ " `PEDIDOS`.`NOMBRE_PROVEEDOR`,"
					+ " `PEDIDOS`.`EMAIL_PROVEEDOR`"
					+ "FROM `fixpack`.`PEDIDOS`; ");

			rs =ps.executeQuery();
			
			while (rs.next()){
				
				id= rs.getInt(1);
				fecha = rs.getTimestamp(2);
				estado=rs.getString(3);
				nombreProveedor =rs.getString(4);	
				emailProveedor =rs.getString(5);	
				
				Pedido pedido = new Pedido(id,fecha,estado,nombreProveedor,emailProveedor);
				
				listaPedidos.add(pedido);
				
			}
			
			ps.close();
			
			Iterator<Pedido> it = listaPedidos.iterator();
			while(it.hasNext()){
				
				int idArticulo, cantidad;
				String nombreArticulo, tipoArticulo;
				
				Pedido p = it.next();
				ArrayList<Articulo> articulos = new ArrayList<Articulo>();
				ResultSet rs2 = null;
				PreparedStatement ps2 = conexion.prepareStatement(
						"SELECT `ARTICULOS`.`ID_ARTICULO`, "
						+ "`ARTICULOS`.`NOMBRE`, "
						+ " `ARTICULOS`.`TIPO`, "
						+ "`PEDIDO_ARTICULO`.`CANTIDAD` "
						+ "FROM `fixpack`.`ARTICULOS` "
						+ "LEFT join	`fixpack`.`PEDIDO_ARTICULO` "
						+ "on `ARTICULOS`.ID_ARTICULO = `PEDIDO_ARTICULO`.ID_ARTICULO "
						+ "WHERE `PEDIDO_ARTICULO`.`ID_PEDIDO` = ?; ");
				
				ps2.setInt(1, p.getId());
				
				rs2= ps2.executeQuery();
				while (rs2.next()){
					
					idArticulo= rs2.getInt(1);
					nombreArticulo = rs2.getString(2);
					tipoArticulo=rs2.getString(3);
					cantidad =rs2.getInt(4);	
				
					Articulo articulo = new Articulo(idArticulo,nombreArticulo,tipoArticulo,cantidad);
					
					articulos.add(articulo);
				}
				
				p.setArticulos(articulos);
				
				ps2.close();
			}
			
			
			
		}
		catch (Exception e){
			e.printStackTrace()	;
		}
		
		return listaPedidos;
	}

	public Pedido obtenerPedido(int id){
	
		Pedido pedido = null;
		Date fecha;
		
		String nombreProveedor,emailProveedor,estado;
		
		ResultSet rs = null;
		try{
			PreparedStatement ps = conexion.prepareStatement(
					"SELECT `PEDIDOS`.`ID_PEDIDO`,"
					+ "`PEDIDOS`.`FECHA`,"
					+ " `PEDIDOS`.`ESTADO`,"
					+ " `PEDIDOS`.`NOMBRE_PROVEEDOR`,"
					+ " `PEDIDOS`.`EMAIL_PROVEEDOR`"
					+ "FROM `fixpack`.`PEDIDOS`"
					+ "WHERE ID_PEDIDO = ?; ");

			ps.setInt(1, id);
			
			rs =ps.executeQuery();
			
			if (rs.next()){
				
				id= rs.getInt(1);
				fecha = rs.getTimestamp(2);
				estado=rs.getString(3);
				nombreProveedor =rs.getString(4);	
				emailProveedor =rs.getString(5);	
				
				pedido = new Pedido(id,fecha,estado,nombreProveedor,emailProveedor);
				ps.close();
				
				int idArticulo, cantidad;
				String nombreArticulo, tipoArticulo;
				
				ArrayList<Articulo> articulos = new ArrayList<Articulo>();
				ResultSet rs2 = null;
				PreparedStatement ps2 = conexion.prepareStatement(
						"SELECT `ARTICULOS`.`ID_ARTICULO`, "
						+ "`ARTICULOS`.`NOMBRE`, "
						+ " `ARTICULOS`.`TIPO`, "
						+ "`PEDIDO_ARTICULO`.`CANTIDAD` "
						+ "FROM `fixpack`.`ARTICULOS` "
						+ "LEFT join	`fixpack`.`PEDIDO_ARTICULO` "
						+ "on `ARTICULOS`.ID_ARTICULO = `PEDIDO_ARTICULO`.ID_ARTICULO "
						+ "WHERE `PEDIDO_ARTICULO`.`ID_PEDIDO` = ?; ");
				
				ps2.setInt(1, pedido.getId());
				
				rs2= ps2.executeQuery();
				while (rs2.next()){
					
					idArticulo= rs2.getInt(1);
					nombreArticulo = rs2.getString(2);
					tipoArticulo=rs2.getString(3);
					cantidad =rs2.getInt(4);	
				
					Articulo articulo = new Articulo(idArticulo,nombreArticulo,tipoArticulo,cantidad);
					
					articulos.add(articulo);
				}
				
				pedido.setArticulos(articulos);
				
				ps2.close();
				
			}
			
			
		}
		catch (Exception e){
			e.printStackTrace()	;
		}
		
		return pedido;
		
	}

	public void guardarPedido(int idPedido, String nombreProveedor, String EmailProveedor, String estado){
		
		try{
			PreparedStatement ps = conexion.prepareStatement(
					" UPDATE `fixpack`.`PEDIDOS` "
					+ "SET NOMBRE_PROVEEDOR = ? "
					+ ",EMAIL_PROVEEDOR = ? "
					+ ",ESTADO = ? "
					+ "WHERE ID_PEDIDO = ? ;");
			
			ps.setString(1, nombreProveedor);
			ps.setString(2, EmailProveedor);
			ps.setString(3, estado);
			ps.setInt(4,idPedido);
			
			ps.executeUpdate();
			ps.close();
		}
		catch (Exception e){
			e.printStackTrace()	;
		}
	}

	public void guardarArticuloPedido(ArrayList<Articulo> articulos, int idPedido) {
		
		Iterator<Articulo> it = articulos.iterator();
		
		try{
			PreparedStatement ps = conexion.prepareStatement(
					" DELETE FROM `fixpack`.`PEDIDO_ARTICULO` "
					+ "WHERE ID_PEDIDO = ? ;");
			
			ps.setInt(1, idPedido);
			
			ps.executeUpdate();
			
			ps.close();
			
			while(it.hasNext()){
				
				Articulo articulo = it.next();
				
				PreparedStatement ps2 = conexion.prepareStatement(
						" INSERT INTO `fixpack`.`PEDIDO_ARTICULO`"
						+ "(`ID_PEDIDO`,"
						+ "`ID_ARTICULO`,"
						+ "`CANTIDAD`) "
						+ "VALUES ("
						+ "?,"
						+ "?,"
						+ "?); ");
				
				ps2.setInt(1,idPedido);
				ps2.setInt(2, articulo.getId());
				ps2.setInt(3, articulo.getCantidad());
				
				ps2.executeUpdate();
			}
		}
		catch(Exception e){
			e.printStackTrace();
		}
		
	}

	public void solicitarPedido(ArrayList<Articulo> articulos) {
		Iterator<Articulo> it = articulos.iterator();
		
		try{
			
			while(it.hasNext()){
				
				Articulo articulo = it.next();
				
				PreparedStatement ps2 = conexion.prepareStatement(
						" UPDATE `fixpack`.`ARTICULOS` "
						+ "SET CANTIDAD = CANTIDAD + ? "
						+ "WHERE ID_ARTICULO = ?");
				
				ps2.setInt(2, articulo.getId());
				ps2.setInt(1, articulo.getCantidad());
				
				ps2.executeUpdate();
			}
		}
		catch(Exception e){
			e.printStackTrace();
		}
		
	}

	public void crearPedido() {

		try{
			
			PreparedStatement ps2 = conexion.prepareStatement(
					"INSERT INTO `fixpack`.`PEDIDOS`"
					+ "(`FECHA`,"
					+ "`ESTADO`,"
					+ "`NOMBRE_PROVEEDOR`,"
					+ "`EMAIL_PROVEEDOR`)"
					+ "VALUES"
					+ "(NOW(),"
					+ "'GUARDADO',"
					+ "'',"
					+ "'') ;");
			
			
			ps2.executeUpdate();
			
		}
		catch(Exception e){
			e.printStackTrace();
		}
	}
	
}
